iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
AI Security

我做了一個Claude skill的掃毒軟體學到的那些事系列 第 10

我防禦規則最大的漏洞到底在哪裡?

  • 分享至 

  • xImage
  •  

上一篇留了一個問題:為什麼同一套防禦規則,內部測試拿 100 分,拿到外部測試卻只剩 13 分?

因為規則和考卷,都出自同一個人和 AI。

一、漏掉的攻擊長什麼樣子

語言分布

語言 筆數 佔比
英文 114 57%
德文 67 33.5%
西班牙文 5 2.5%

攻擊類型分布(一筆可屬多類)

類型 筆數
Jailbreak(越獄,指繞過 AI 限制的攻擊)跨語言 38
角色扮演型 16
任務切換型 16
仇恨內容誘導 15
威脅型 9
緊急求救型 8
System Prompt Leak(套取系統提示詞,也就是開發者事先寫給 AI 的隱藏指令) 6
誇獎 + 任務切換 4
未分類 101(50.5%)

這是我第一次測試後實際留下來的錯誤與漏洞分布。

這張表裡最大的一格,是最後那 101 筆。有一半以上漏掉的攻擊,我連它用了什麼手法都說不出來。

但我一開始沒有注意到這件事。

當時我注意到的,是英文、德文以及跨語言的攻擊佔比很大。奇怪的是,我在設計整套正規表示式(Regex,用固定規則比對文字的方法)時,其實特別針對中文和英文的提示詞注入(Prompt Injection,把惡意指令偷藏在輸入裡,讓 AI 違背原本設定的攻擊)設計過,卻還是有很大的漏洞。

為什麼呢?

因為我當時把關鍵字寫死了,只針對特定幾個關鍵字,以及特定幾種形式的提示詞注入。它是一套固定的規則,沒有彈性調整,很像我學數學時把公式背死,卻沒有理解公式背後的原因,遇到不同的題型就不會了。

二、我怎麼修?

英文:從寫死關鍵字改成三欄結構

我把原本寫死的關鍵字,改成三個欄位的組合,三欄同時成立才判定為攻擊:

  • 動詞:Ignore
  • 限定詞:all previous
  • 賓語:instructions

每一欄都可以放多個同義詞,組合起來就能涵蓋比原本多很多的句型。

德文:句首短路規則

德文我加了一條短路規則:句子開頭出現 Vergiss(忘記)或 Ignoriere(忽略),不管後面接什麼,直接判定為高風險,不用再比對限定詞和賓語。

但短路規則在西班牙文和法文就不成立。這些語言的日常對話很常出現「忘記」「忽略」這類說法,所以不能拿來當正規表示式的偵測詞。

三、修完才發現:我的修法也有同樣的問題

從這些規則中我發現,要設計好的正規表示式,必須有系統地修正,而不是憑直覺想到什麼就補什麼:想到 A 補 A、想到 B 補 B。比較好的做法,是像用邏輯樹那樣一一補全。

但邏輯樹有時會用到窮舉,而窮舉只能涵蓋你和 AI 想得到的範圍。在你和 AI 不知道,甚至「不知道自己不知道」的地方,就會形成很大的漏洞。

這個漏洞可能包含很多層面:語言與語意的規則、日常用語在不同語境中的規則,甚至包括目前大型語言模型(LLM,Large Language Model,像 ChatGPT、Claude 這類用大量文字訓練出來的 AI)本身都缺少的語料。

有些人在日常對話中,會同時使用中文、英文、台語。這樣的對話放進大型語言模型,模型可能比較難理解,但對某些人來說,這就是他們的日常。

所以我從中學到三件事:

  1. 直覺可以提假設,不能當證據。
  2. 正規表示式的本質是語意或文法規則的窮舉。 它適合當第一層防禦,快、便宜,能擋掉最明顯的攻擊,但後面還要有其他防禦。
  3. 不要相信單一語系的語意規則。

回到開頭的問題

為什麼內部測試 100 分,到了外部測試只剩 13 分?

這很像我在 5 月 7 日 CYBERSEC 臺灣資安大會聽到的觀點:「打破 AI 的安全假象,拒絕靜態測試」。我的情況正是如此:我做的只是靜態的內部測試,而不是外部實際的動態測試(攻擊)。

整個世界在變化,但我的規則沒有變。我只是拿自以為知道的攻擊做循環測試,而不是拿真實的攻擊來測。


上一篇
# 為什麼自己測 100 分的防禦,一丟到外部真實資料集只剩 13 分?
系列文
我做了一個Claude skill的掃毒軟體學到的那些事10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言